/** 闭包
 * 对象重名赋值时容易更改重要数据，采用闭包保护数据；
 * @returns
 */
export function hideData() {
  const data: { [index: number | string]: any } = {};
  return {
    set: function (key: string | number, value: any) {
      data[key] = value;
    },
    get: function (key: string | number) {
      return data[key];
    },
  };
}

/** 受保护的只读数据
 * 断开原型链，避免修改数据
 * @returns
 */
export const protData = (function protectedData() {
  const data = {
    a: 1,
    b: 2,
    c: 3,
  };
  return {
    get: function (key: keyof typeof data) {
      //防止通过原型链访问数据，修改数据。
      if (data.hasOwnProperty(key)) {
        return data[key];
      }
    },
  };
})();

export function debounce(fn: Function, delay = 1000, ...arg1: any[]) {
  let timer: number | null = null;
  return (...args2: any[]) => {
    timer && clearTimeout(timer);
    timer = window.setTimeout(() => {
      fn(...arg1, ...args2);
    }, delay);
  };
}
